using System;
using System.Collections.Generic;
using System.Text;

using System.Data.Common;

using MakeIT.Framework.Data;
using MakeIT.SGI.ERP.Entidades;

namespace MakeIT.SGI.ERP.Negocios
{
	public partial class SgiDAOT : DAOT
	{

        public PerfilxobjetoVO getPerfilxobjeto(int? idPerfilXObjeto)
        {
            return getPerfilxobjeto(idPerfilXObjeto, null, null);
        }

        public PerfilxobjetoVO getPerfilxobjeto(int? idPerfilXObjeto, int? idPerfil)
        {
            return getPerfilxobjeto(idPerfilXObjeto, idPerfil, null);
        }

		public PerfilxobjetoVO getPerfilxobjeto(int? idPerfilXObjeto, int? idPerfil, int? idObjeto)
		{
			PerfilxobjetoVO perfilxobjetoVO = null;
			List<PerfilxobjetoVO> listPerfilxobjetoVOs = getPerfilxobjetos(idPerfilXObjeto, idPerfil, idObjeto, null, null);
			if (listPerfilxobjetoVOs != null && listPerfilxobjetoVOs.Count > 0)
			{
				perfilxobjetoVO = listPerfilxobjetoVOs[0];
			}
			return perfilxobjetoVO;
		}

		public List<PerfilxobjetoVO> getPerfilxobjetos()
		{
			return getPerfilxobjetos(null, null, null, null, null);
		}

		public List<PerfilxobjetoVO> getPerfilxobjetos(int? idPerfilXObjeto)
		{
			return getPerfilxobjetos(idPerfilXObjeto, null, null, null, null);
		}

        public List<PerfilxobjetoVO> getPerfilxobjetos(int? idPerfilXObjeto, int? idPerfil, int? idObjeto)
        {
            return getPerfilxobjetos(idPerfilXObjeto, idPerfil, idObjeto, null, null);
        }

		public List<PerfilxobjetoVO> getPerfilxobjetos(int? idPerfilXObjeto, int? idPerfil, int? idObjeto, bool? visivel, bool? habilitado)
		{
			string where = "WHERE ";
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT pxo.idPerfilXObjeto as pxo_idPerfilXObjeto, pxo.idPerfil as pxo_idPerfil, per.perfil as per_perfil, pxo.idObjeto as pxo_idObjeto, obi.objeto as obi_objeto, pxo.visivel as pxo_visivel, pxo.habilitado as pxo_habilitado, pxo.Cadastro as pxo_Cadastro, pxo.CadastradoPor as pxo_CadastradoPor, pxo.Edicao as pxo_Edicao, pxo.EditadoPor as pxo_EditadoPor  ");
			query.AppendLine("FROM perfilxobjeto as pxo LEFT OUTER JOIN perfil as per on pxo.idPerfil=per.idPerfil  LEFT OUTER JOIN objeto as obi on pxo.idObjeto=obi.idObjeto  ");
			if (idPerfilXObjeto != null)
			{
				query.AppendLine(where + "pxo.idPerfilXObjeto=@idPerfilXObjeto ");
				where = "AND ";
			}
			if (idPerfil != null)
			{
				query.AppendLine(where + "pxo.idPerfil=@idPerfil ");
				where = "AND ";
			}
			if (idObjeto != null)
			{
				query.AppendLine(where + "pxo.idObjeto=@idObjeto ");
				where = "AND ";
			}
			if (visivel != null)
			{
				query.AppendLine(where + "pxo.visivel=@visivel ");
				where = "AND ";
			}
			if (habilitado != null)
			{
				query.AppendLine(where + "pxo.habilitado=@habilitado ");
				where = "AND ";
			}


			query.AppendLine("ORDER BY pxo.idPerfilXObjeto ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			if (idPerfilXObjeto!= null) cmd.Parameters.Add(getParameter(cmd, "@idPerfilXObjeto", idPerfilXObjeto));
			if (idPerfil!= null) cmd.Parameters.Add(getParameter(cmd, "@idPerfil", idPerfil));
			if (idObjeto!= null) cmd.Parameters.Add(getParameter(cmd, "@idObjeto", idObjeto));
			if (visivel!= null) cmd.Parameters.Add(getParameter(cmd, "@visivel", visivel.Value?"S":"N"));
			if (habilitado!= null) cmd.Parameters.Add(getParameter(cmd, "@habilitado", habilitado.Value?"S":"N"));


			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();

				List<PerfilxobjetoVO> listPerfilxobjeto = new List<PerfilxobjetoVO>();

				while (reader.Read())
				{
					PerfilxobjetoVO perfilxobjetoVO = PerfilxobjetoVO.CreateVO();
					perfilxobjetoVO.idPerfilXObjeto = reader.GetInt32(reader.GetOrdinal("pxo_idPerfilXObjeto"));
					perfilxobjetoVO.idPerfil = reader.GetInt32(reader.GetOrdinal("pxo_idPerfil"));
					if (!reader.IsDBNull(reader.GetOrdinal("per_perfil")))
						perfilxobjetoVO.idPerfilVO.perfil = reader.GetString(reader.GetOrdinal("per_perfil"));
					perfilxobjetoVO.idObjeto = reader.GetInt32(reader.GetOrdinal("pxo_idObjeto"));
					if (!reader.IsDBNull(reader.GetOrdinal("obi_objeto")))
						perfilxobjetoVO.idObjetoVO.objeto = reader.GetString(reader.GetOrdinal("obi_objeto"));
					perfilxobjetoVO.visivel = reader.GetString(reader.GetOrdinal("pxo_visivel")).Equals("S");
					perfilxobjetoVO.habilitado = reader.GetString(reader.GetOrdinal("pxo_habilitado")).Equals("S");
					perfilxobjetoVO.cadastro = reader.GetDateTime(reader.GetOrdinal("pxo_Cadastro"));
					perfilxobjetoVO.cadastradoPor = reader.GetString(reader.GetOrdinal("pxo_CadastradoPor"));
					perfilxobjetoVO.edicao = reader.GetDateTime(reader.GetOrdinal("pxo_Edicao"));
					perfilxobjetoVO.editadoPor = reader.GetString(reader.GetOrdinal("pxo_EditadoPor"));


					listPerfilxobjeto.Add(perfilxobjetoVO);
				}
				reader.Close();
				return listPerfilxobjeto;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}

		public void setPerfilxobjeto(PerfilxobjetoVO perfilxobjetoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("UPDATE perfilxobjeto ");
			query.AppendLine("SET idPerfil=@idPerfil, idObjeto=@idObjeto, visivel=@visivel, habilitado=@habilitado, Edicao=@Edicao, EditadoPor=@EditadoPor ");
			query.AppendLine("WHERE idPerfilXObjeto=@idPerfilXObjeto ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idPerfilXObjeto", perfilxobjetoVO.idPerfilXObjeto));
			cmd.Parameters.Add(getParameter(cmd, "@idPerfil", perfilxobjetoVO.idPerfil));
			cmd.Parameters.Add(getParameter(cmd, "@idObjeto", perfilxobjetoVO.idObjeto));
			cmd.Parameters.Add(getParameter(cmd, "@visivel", (perfilxobjetoVO.visivel==null?" ":(perfilxobjetoVO.visivel.Value?"S":"N"))));
			cmd.Parameters.Add(getParameter(cmd, "@habilitado", (perfilxobjetoVO.habilitado==null?" ":(perfilxobjetoVO.habilitado.Value?"S":"N"))));
			cmd.Parameters.Add(getParameter(cmd, "@Edicao", perfilxobjetoVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@EditadoPor", perfilxobjetoVO.editadoPor));

			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}

		public long newPerfilxobjeto(PerfilxobjetoVO perfilxobjetoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("INSERT INTO perfilxobjeto ");
			query.AppendLine("  ( idPerfil, idObjeto, visivel, habilitado, Cadastro, CadastradoPor, Edicao, EditadoPor ) ");
			query.AppendLine("VALUES ( @idPerfil, @idObjeto, @visivel, @habilitado, @Cadastro, @CadastradoPor, @Edicao, @EditadoPor ) ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idPerfil", perfilxobjetoVO.idPerfil));
			cmd.Parameters.Add(getParameter(cmd, "@idObjeto", perfilxobjetoVO.idObjeto));
			cmd.Parameters.Add(getParameter(cmd, "@visivel", (perfilxobjetoVO.visivel==null?" ":(perfilxobjetoVO.visivel.Value?"S":"N"))));
			cmd.Parameters.Add(getParameter(cmd, "@habilitado", (perfilxobjetoVO.habilitado==null?" ":(perfilxobjetoVO.habilitado.Value?"S":"N"))));
			cmd.Parameters.Add(getParameter(cmd, "@Cadastro", perfilxobjetoVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@CadastradoPor", perfilxobjetoVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@Edicao", perfilxobjetoVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@EditadoPor", perfilxobjetoVO.editadoPor));


			try
			{
				cmd.ExecuteNonQuery();

				long newID = 0;
				if (tipo.Equals(DBType.MSSql))
				{
					cmd.CommandText = "SELECT IDENT_CURRENT('perfilxobjeto') AS 'Identity' ";
					DbDataReader reader = cmd.ExecuteReader();
					reader.Read();
					newID = (long)reader.GetDecimal(reader.GetOrdinal("Identity"));
					reader.Close();
				}
				else if (tipo.Equals(DBType.MySql))
				{
					newID = ((MySql.Data.MySqlClient.MySqlCommand)cmd).LastInsertedId;
				}
				else if (tipo.Equals(DBType.ODBC))
				{
					//TODO implementar
				}
				else if (tipo.Equals(DBType.ORACLE))
				{
					//TODO implementar
				}
				return newID;
			}
			catch (Exception ex) { throw ex; }

		}

		public void delPerfilxobjeto(PerfilxobjetoVO perfilxobjetoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("DELETE FROM perfilxobjeto ");
			query.AppendLine("WHERE idPerfilXObjeto=@idPerfilXObjeto ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idPerfilXObjeto", perfilxobjetoVO.idPerfilXObjeto));


			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}
		public int getCountPerfilxobjetoxIdPerfil(int? idPerfil)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idPerfil) as ocorrencias FROM perfilxobjeto WHERE IdPerfil=@IdPerfil ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdPerfil", idPerfil));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
		public int getCountPerfilxobjetoxIdObjeto(int? idObjeto)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idObjeto) as ocorrencias FROM perfilxobjeto WHERE IdObjeto=@IdObjeto ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdObjeto", idObjeto));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
	}
}
